#!/bin/bash

# Plan7.md Web 功能测试执行脚本
# 全面验证 vert.cj 的核心 Web 功能

set -e

echo "🚀 开始执行 Plan7.md Web 功能测试套件"
echo "========================================"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 测试结果统计
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0

# 日志文件
LOG_FILE="plan7_test_results.log"
echo "Plan7 Web 功能测试结果 - $(date)" > $LOG_FILE

# 函数：运行单个测试
run_test() {
    local test_name=$1
    local test_class=$2
    
    echo -e "${BLUE}📋 运行测试: $test_name${NC}"
    echo "----------------------------------------"
    
    TOTAL_TESTS=$((TOTAL_TESTS + 1))
    
    # 记录开始时间
    start_time=$(date +%s)
    
    # 运行测试
    if cjpm test --name "$test_class" 2>&1 | tee -a $LOG_FILE; then
        end_time=$(date +%s)
        duration=$((end_time - start_time))
        
        echo -e "${GREEN}✅ $test_name 测试通过 (耗时: ${duration}s)${NC}"
        echo "$test_name: PASSED (${duration}s)" >> $LOG_FILE
        PASSED_TESTS=$((PASSED_TESTS + 1))
    else
        end_time=$(date +%s)
        duration=$((end_time - start_time))
        
        echo -e "${RED}❌ $test_name 测试失败 (耗时: ${duration}s)${NC}"
        echo "$test_name: FAILED (${duration}s)" >> $LOG_FILE
        FAILED_TESTS=$((FAILED_TESTS + 1))
    fi
    
    echo ""
}

# 函数：检查构建状态
check_build() {
    echo -e "${BLUE}🔧 检查项目构建状态...${NC}"
    
    if cjpm build; then
        echo -e "${GREEN}✅ 项目构建成功${NC}"
        echo "Build: SUCCESS" >> $LOG_FILE
    else
        echo -e "${RED}❌ 项目构建失败，无法继续测试${NC}"
        echo "Build: FAILED" >> $LOG_FILE
        exit 1
    fi
    echo ""
}

# 函数：生成测试报告
generate_report() {
    echo -e "${BLUE}📊 生成测试报告...${NC}"
    echo "========================================"
    
    local success_rate=0
    if [ $TOTAL_TESTS -gt 0 ]; then
        success_rate=$((PASSED_TESTS * 100 / TOTAL_TESTS))
    fi
    
    echo -e "${BLUE}📈 Plan7 Web 功能测试总结${NC}"
    echo "----------------------------------------"
    echo -e "总测试数: ${BLUE}$TOTAL_TESTS${NC}"
    echo -e "通过测试: ${GREEN}$PASSED_TESTS${NC}"
    echo -e "失败测试: ${RED}$FAILED_TESTS${NC}"
    echo -e "成功率: ${YELLOW}$success_rate%${NC}"
    echo ""
    
    # 写入报告文件
    cat >> $LOG_FILE << EOF

========================================
Plan7 Web 功能测试总结
========================================
测试时间: $(date)
总测试数: $TOTAL_TESTS
通过测试: $PASSED_TESTS
失败测试: $FAILED_TESTS
成功率: $success_rate%

EOF
    
    # 根据测试结果设置退出码
    if [ $FAILED_TESTS -eq 0 ]; then
        echo -e "${GREEN}🎉 所有测试通过！${NC}"
        echo "Overall Result: ALL TESTS PASSED" >> $LOG_FILE
        return 0
    else
        echo -e "${RED}⚠️  有测试失败，请检查日志文件: $LOG_FILE${NC}"
        echo "Overall Result: SOME TESTS FAILED" >> $LOG_FILE
        return 1
    fi
}

# 函数：运行性能基准测试
run_performance_benchmark() {
    echo -e "${BLUE}🚀 运行性能基准测试...${NC}"
    echo "----------------------------------------"
    
    # 启动测试服务器
    echo "启动性能测试服务器..."
    cjpm run --name vert.examples.performance_server &
    SERVER_PID=$!
    
    # 等待服务器启动
    sleep 3
    
    # 运行 wrk 性能测试（如果可用）
    if command -v wrk &> /dev/null; then
        echo "使用 wrk 进行负载测试..."
        
        echo "测试 1: 简单 GET 请求"
        wrk -t4 -c100 -d10s --latency http://127.0.0.1:8089/perf/simple | tee -a $LOG_FILE
        
        echo "测试 2: JSON API 请求"
        wrk -t4 -c50 -d10s --latency http://127.0.0.1:8089/perf/json | tee -a $LOG_FILE
        
    else
        echo -e "${YELLOW}⚠️  wrk 未安装，跳过外部负载测试${NC}"
    fi
    
    # 停止测试服务器
    kill $SERVER_PID 2>/dev/null || true
    
    echo -e "${GREEN}✅ 性能基准测试完成${NC}"
    echo ""
}

# 函数：检查依赖
check_dependencies() {
    echo -e "${BLUE}🔍 检查测试依赖...${NC}"
    
    # 检查 cjpm
    if ! command -v cjpm &> /dev/null; then
        echo -e "${RED}❌ cjpm 未找到，请安装 Cangjie 开发环境${NC}"
        exit 1
    fi
    
    # 检查项目结构
    if [ ! -f "cjpm.toml" ]; then
        echo -e "${RED}❌ 未找到 cjpm.toml，请在项目根目录运行此脚本${NC}"
        exit 1
    fi
    
    echo -e "${GREEN}✅ 依赖检查通过${NC}"
    echo ""
}

# 主执行流程
main() {
    echo "开始时间: $(date)"
    echo ""
    
    # 检查依赖
    check_dependencies
    
    # 检查构建
    check_build
    
    # 第一阶段：核心功能测试
    echo -e "${YELLOW}🔥 第一阶段：核心 Web 功能测试${NC}"
    echo "========================================"
    
    run_test "Web 功能综合测试" "vert.tests.Plan7WebComprehensiveTest"
    run_test "WebSocket 功能测试" "vert.tests.Plan7WebSocketTest"
    run_test "类型安全功能测试" "vert.tests.Plan6Stage4TypeSafeTest"
    
    # 第二阶段：性能测试
    echo -e "${YELLOW}⚡ 第二阶段：性能和负载测试${NC}"
    echo "========================================"
    
    run_test "Web 性能测试" "vert.tests.Plan7PerformanceTest"
    
    # 第三阶段：集成测试
    echo -e "${YELLOW}🔗 第三阶段：集成和系统测试${NC}"
    echo "========================================"
    
    run_test "HTTP 服务器测试" "vert.tests.HttpServerTest"
    run_test "路由系统测试" "vert.tests.RouterTest"
    run_test "核心功能测试" "vert.tests.CoreTest"
    
    # 第四阶段：性能基准测试
    echo -e "${YELLOW}📊 第四阶段：性能基准测试${NC}"
    echo "========================================"
    
    # 注释掉性能基准测试，因为需要额外的服务器设置
    # run_performance_benchmark
    echo -e "${YELLOW}⚠️  性能基准测试需要手动运行，请参考 BENCHMARK_README.md${NC}"
    
    # 生成测试报告
    generate_report
}

# 处理中断信号
trap 'echo -e "\n${RED}测试被中断${NC}"; exit 1' INT TERM

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        --quick)
            echo -e "${YELLOW}🏃 快速测试模式${NC}"
            QUICK_MODE=true
            shift
            ;;
        --performance-only)
            echo -e "${YELLOW}⚡ 仅运行性能测试${NC}"
            PERFORMANCE_ONLY=true
            shift
            ;;
        --help)
            echo "Plan7 Web 功能测试脚本"
            echo ""
            echo "用法: $0 [选项]"
            echo ""
            echo "选项:"
            echo "  --quick           快速测试模式（跳过长时间测试）"
            echo "  --performance-only 仅运行性能测试"
            echo "  --help            显示此帮助信息"
            echo ""
            exit 0
            ;;
        *)
            echo -e "${RED}未知选项: $1${NC}"
            echo "使用 --help 查看可用选项"
            exit 1
            ;;
    esac
done

# 根据模式执行不同的测试
if [ "$PERFORMANCE_ONLY" = true ]; then
    check_dependencies
    check_build
    run_test "Web 性能测试" "vert.tests.Plan7PerformanceTest"
    run_performance_benchmark
    generate_report
else
    main
fi

echo ""
echo "结束时间: $(date)"
echo -e "${BLUE}📋 详细日志请查看: $LOG_FILE${NC}"
